package main

import (
	"fmt"
)

//定义[]数据类型

func main(){
	arr := [5]int{1,2,3,4,5}

	//切片
	slice := arr[1:3]
	fmt.Println("arr = ",arr)
	fmt.Println("slice = ",slice)
	fmt.Println("slice的元素个数:",len(slice))
	fmt.Println("slice的容量:",cap(slice))
	//slice为引用类型，slice中值变化影响原数组中的数据
	//slice底层可以看作是一个结构体，保存了第一个元素的地址，元素个数和slice的容量

	//切片的定义
	//1.引用一个已经定义好的数组
	//2.通过make来创建切片
	var slice2 []int = make([]int, 3,10) //数据类型，大小，容量
	slice2[0] = 10
	slice2[1] = 20
	fmt.Println("slice2 =",slice2,",大小为",len(slice2),",容量为",cap(slice2))
	//3.直接定义
	var slice3 []int = []int{1,2,3,4,5}
	fmt.Println("slice3 =",slice3,",大小为",len(slice3),",容量为",cap(slice3))

	//切片的遍历
	for i:=0;i<len(slice3);i++{
		fmt.Println(slice3[i])
	}
	for index,value := range slice3{
		fmt.Println("index = ",index,"value = ",value)
	}

	//使用append追加数据	自动扩容
	slice3 = append(slice3, 6,7)
	fmt.Println("slice3 =",slice3,",大小为",len(slice3),",容量为",cap(slice3))

	//可以使用copy函数进行拷贝	不会自动扩容
	//copy(target,source)	两个参数都是切片类型

	//string本质也是一个切片
	//修改string
	string1 := "hello world"
	stringArr := []rune(string1)
	stringArr[0] = 't'
	string2 := string(stringArr)
	fmt.Println(string2)
}